package ru.sushka.lunch.gui.models;

import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;

import ru.sushka.lunch.dao.AbstractDao;
import ru.sushka.lunch.enitiy.Course;
import ru.sushka.lunch.enitiy.Customer;
import ru.sushka.lunch.enitiy.MenuItem;
import ru.sushka.lunch.enitiy.Order;
import ru.sushka.lunch.factory.FactoryCreator;
import ru.sushka.lunch.gui.AbstractOrderModel;

public class OrderModel implements AbstractOrderModel {

    private List<Order> orderList;
    private AbstractDao<MenuItem> menuItemDao;
    private AbstractDao<Order> orderDao;
    private AbstractDao<Course> courseDao;

    public OrderModel(){
        courseDao = FactoryCreator.getFactory().getCourseDao();
        menuItemDao = FactoryCreator.getFactory().getMenuItemDao();
        orderDao = FactoryCreator.getFactory().getOrderDao();
        orderList = new ArrayList<Order>();
    }
    
    
    @Override
    public void addOrder(Order order) {
        orderList.add(order);
    }

    @Override
    public void removeOrder(Order order) {
        orderList.remove(order);        
    }

    @Override
    public void saveOrderList(Customer customer) {
        for(Order order: orderList){
            order.setDate(getOrderDate());
            orderDao.insert(order);
        }    
    }

    @Override
    public void loadOrderList(Customer customer) {
        for(Order order: orderDao.getList("")){
            if (order.getCustomerId() == customer.getId()
                    && equalsDate(order.getDate(), getOrderDate())) {
                orderList.add(order);
            }
        }
    }


    @Override
    public List<Course> getMenuList() {
        List<Course> menuItems = new ArrayList<Course>();
        Calendar actualDate = getMenuExpiryDate();
        for(MenuItem item:menuItemDao.getList("")){
            if(equalsDate(item.getDate(), actualDate)){
                Course course = courseDao.get(item.getCourseId());
                menuItems.add(course);
            }
        }
        return menuItems;
    }


    @Override
    public List<Order> getOrderList(Customer customer) {
        return orderList;
    }
    
    @Override
    public Calendar getMenuExpiryDate(){
        Calendar actualDate = Calendar.getInstance();
        for(MenuItem item:menuItemDao.getList("")){
            if(item.getDate().after(actualDate)){
                actualDate.setTime(item.getDate().getTime());
            }
        }
        return actualDate;
    }
    
    //TODO скидка
    @Override
    public int getTotalOrderCost(Customer customer) {
        int totalCost = 0;
        //в начале считаем сумму, уже сохраненных заказов
        //не учитывая уже сохраненные для текущего пользователя
        for(Order order: orderDao.getList("")){
            if (equalsDate(order.getDate(), getOrderDate()) &&
                    order.getCustomerId() != customer.getId()) {
                Course course = courseDao.get(order.getMenuItemId());
                totalCost += course.getPrice()*order.getCount();
            }
        }
        //потом прибавляем сумму того, что хронится в модели
        return totalCost + getCustomerOrderCost();
    }


    @Override
    public int getCustomerOrderCost() {
        int totalCost = 0;
        for(Order order: orderList){
            Course course = courseDao.get(order.getMenuItemId());
            totalCost += course.getPrice()*order.getCount();
        }
        return totalCost;
    }
    
    /**
     * вычисление даты заказа. можем заказывать только на следующий день.
     * текущий день + 1
     * если текущий день - пятница: текущий день + 3
     */
    public Calendar getOrderDate(){
        Calendar date = Calendar.getInstance();
        if(date.get(Calendar.DAY_OF_WEEK) == Calendar.FRIDAY){
            date.add(Calendar.DAY_OF_MONTH, 3);
        } else {
            date.add(Calendar.DAY_OF_MONTH, 1);
        }
        return date;
    }

    
    private boolean equalsDate(Calendar date1, Calendar date2){
        if(date1.get(Calendar.YEAR) == date2.get(Calendar.YEAR) &&
           date1.get(Calendar.MONTH) == date2.get(Calendar.MONTH) &&
           date1.get(Calendar.DAY_OF_MONTH) == date2.get(Calendar.DAY_OF_MONTH)){
            return true;
        }
        return false;
    }

    public Course getCourse(int id){
        return courseDao.get(id);
    }
}
